// Proxy 对象  

const { property } = require("lodash")

// Object.defineProperty 可以为对象添加属性, 可捕获到对象中属性的读写过程
// 被应用到Vue3.0以前的版本来获取数据响应,实现双向数据绑定

// Proxy 代理器,  可捕获到对象中属性的读写过程  

/**
 *  target*: 参数表示所要拦截的目标对象
 *  handler*: 参数也是一个对象，用来定制拦截行为. 如果handler没有设置任何拦截，那就等同于直接通向原对象。
 */
// const proxy = new Proxy(target, handler);

const person = {
  name: 'husky',
  age: 60
}

const personProxy = new Proxy(person, {
  get(target, property){
    return property in target ? target[property] : undefined
  },  //监听目标对象属性的读
  set(target, property, value){
    if(property === 'age'){
      if(!Number.isInteger(value)){
        throw new TypeError(`${value} is not an int`)
      }
    }
    target[property] = value
  },
  deleteProperty(target, property){  //delete 操作
    if(property in target ){
      return delete  target[property] 
    }
    throw new TypeError(`${property} is not found`)
  },
})

// console.log(personProxy.name)
// console.log(personProxy.aaa)
// personProxy.gender = 'girl'
// console.log('set',personProxy.gender)
// // personProxy.age = '18'

// delete personProxy.gender
// // delete personProxy.b
// console.log('delete',personProxy)  


// proxy监视数组  
const list = []
const listProxy = new Proxy(list, {
  set (target, property, value){
    console.log('set', {property, value})
    target[property] = value
    return true //表示设置成功
  }
})

listProxy.push(11)


